package com.tianyadu.mmall.core.conf;

import com.tianyadu.mmall.core.properties.MallSecurityProperties;
import com.tianyadu.mmall.core.validate.code.service.SmsCodeSender;
import com.tianyadu.mmall.core.validate.code.service.ValidateCodeGenerator;
import com.tianyadu.mmall.core.validate.code.service.impl.DefaultSmsCodeSenderImpl;
import com.tianyadu.mmall.core.validate.code.service.impl.ImageValidateCodeGenerator;
import com.tianyadu.mmall.core.validate.code.service.impl.SmsValidateCodeGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 验证码相关的扩展点配置。
 * 配置在此的bean，业务系统都可以通过，声明同类型或同名的bean，来覆盖安全模块默认的配置。
 *
 * @author xueyj
 * @date 2019-11-12 22:02
 */
@Configuration
public class ValidateCodeBeanConfig {

    /**
     * 获取Security配置属性
     */
    @Autowired
    private MallSecurityProperties securityProperties;

    /**
     * 图片验证码图片生成器
     * onditionalOnMissingBean: 检查spring容器中是否存在imageCodeGenerator相关bean信息
     * 若不存在，则使用默认生成
     * 若存在，则使用已有imageCodeGenerator相关信息
     *
     * @return com.tianyadu.mmall.core.validate.code.service.ValidateCodeGenerator
     * @author xueyj
     * @date 2019/11/13-22:27
     */
    @Bean
    @ConditionalOnMissingBean(name = "imageValidateCodeGenerator")
    public ValidateCodeGenerator imageValidateCodeProcessor() {
        //  初始化默认图形验证码生成器
        ImageValidateCodeGenerator codeGenerator = new ImageValidateCodeGenerator();
        //  设置图形验证码相关安全认证配置
        codeGenerator.setSecurityProperties(securityProperties);
        return codeGenerator;
    }

    /**
     * 短信验证码生成器
     * onditionalOnMissingBean: 检查spring容器中是否存在smsCodeGenerator相关bean信息
     * 若自定义短信验证码，则采用自定义短信验证码生成逻辑，
     * 若未自定义，则使用默认逻辑
     *
     * @return com.tianyadu.mmall.core.validate.code.service.ValidateCodeGenerator
     * @author xueyj
     * @date 2019/11/13-22:27
     */
    @Bean
    @ConditionalOnMissingBean(SmsValidateCodeGenerator.class)
    public ValidateCodeGenerator smsCodeGenerator() {
        //  初始化默认图形验证码生成器
        return new SmsValidateCodeGenerator();
    }

    /**
     * 发送短信
     * onditionalOnMissingBean: 检查spring容器中是否存在smsCodeSender相关bean信息
     * 若自定义发送短信验证码，则采用自定义短信验证码发送逻辑，
     * 若未自定义，则使用默认发送逻辑，
     *
     * @return com.tianyadu.mmall.core.validate.code.sms.SmsCodeSender
     * @author xueyj
     * @date 2019/11/13-23:54
     */
    @Bean
    @ConditionalOnMissingBean(SmsCodeSender.class)
    public SmsCodeSender smsCodeSender() {
        return new DefaultSmsCodeSenderImpl();
    }
}